perm filename GUNLO.SAI[SYS,HE] blob sn#106015 filedate 1974-06-07 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00017 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	GUNLO - the driver program
C00005 00003	_ global storage
C00007 00004	_ external procedures 
C00009 00005	_ initialize program
C00011 00006	_ set adjustable constants
C00012 00007	_ outer-level dynamic storage allocation
C00015 00008	_ initialization and program (command) loop of BLOCK3.
C00017 00009	_ command decoding loop
C00020 00010	_ sub-command decoding - DO, MARK, UNMARK, PLOT
C00022 00011	_	more sub-command decoding - EDIT, KILL, PRINT
C00024 00012	_  more sub-command decoding - SET
C00026 00013	_ more sub-command decoding - CALL
C00028 00014	_ more sub-command decoding - SHOW
C00032 00015	_ more sub-command decoding - NO, SAV
C00034 00016	_ more sub-command decoding - RECEIVE
C00036 00017	_ end of sub-command decoding - INPUT
C00038 ENDMK
C⊗;
COMMENT	GUNLO - the driver program;

BEGIN "GUNLO"

REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
REQUIRE "SYS:PROCES.DEF" SOURCE_FILE;
REQUIRE "DPYSUB.HDR[SYS,HE]" SOURCE_FILE;
REQUIRE "HELIB[1,3]" LIBRARY;

REQUIRE "LINE[SYS,HE]" LOAD_MODULE,
	"LINVER[SYS,HE]" LOAD_MODULE,
	"SCENE[SYS,HE]" LOAD_MODULE,
	"FORSER[SYS,HE]" LOAD_MODULE,
	"SAISER[SYS,HE]" LOAD_MODULE,
	"SAIDIS[SYS,HE]" LOAD_MODULE,
	"PROT[SYS,HE]" LOAD_MODULE,
	"SAVRES[SYS,HE]" LOAD_MODULE,
	"MAPS1[SYS,HE]" LOAD_MODULE,
	"MAPS2[SYS,HE]" LOAD_MODULE,
	"GUNFAI[SYS,HE]" LOAD_MODULE;

DEFINE QFOP="FORWARD PROCEDURE",
	QRI="REFERENCE INTEGER",
	QEP="EXTERNAL SIMPLE PROCEDURE",
	QENP="EXTERNAL PROCEDURE",
	QEIP="EXTERNAL SIMPLE INTEGER PROCEDURE",
	QERP="EXTERNAL SIMPLE REAL PROCEDURE",
	QS="STRING",
	QESP="EXTERNAL SIMPLE STRING PROCEDURE",
	QRA="REAL ARRAY",
	QIA="INTEGER ARRAY",
	QR="REAL",
	QI="INTEGER",
	CL="'15&'12",
	QRR="REFERENCE REAL",
	_="COMMENT",
	QUNFIN="IF BRCHAR='12 THEN GO COMND ELSE GO",
	QUEST="OUTCHR(""?"")",
	QRETURN="BEGIN UNTELL; RETURN END",
	LOOP(I,J,K,L)="FOR I←J STEP L UNTIL K DO",
	QERR="IF ERR THEN BEGIN ERR←0; GO COM2 END",
	QFTREV="IF FTREV=1 THEN ""←"" ELSE ""→""",
	NUMI="CVD(QREAD)",
	SAFEX="SAFE";
_ global storage;

LABEL BL1;

INTERNAL STRING H,COMSTR,NAME,MFILE,COMSAV,LIEXT,EDEXT,PREXT;

INTERNAL REAL RDEP,RMEDA,SHRINK,RDDP,RDNP,RMSD,RMLG,RWIC,RMLE,RCDI,RMALS,
	RMRLS,RDUM,RMSAF,RELLF,RMAP,IRX,IRY,DSCX,DSCY,ISCX,ISCY;

INTERNAL INTEGER IDUM,IA,IB,IC,ID,IE,WHERE,BRCHAR,NGRF,NPAR,NOV,
	NLPT,CVLIN,IWHAT,NOEPL,NOEPM,NOEPA,NOL,IFREEL,IFREEV,
	MAXNOL,MSAFA,NOBAL,MAXNOV,LDATE,ILLL,ILFL,LNCRE1,LNCRE2,MODE,
	SCALE,SIZE,LOCB,LOCT,ORIGX,ORIGY,WIND,DHOLD,IAEDG,MCHAN,MTRACE,
	MODIF,FULREC,ERR,PLTOT,NPRO,PFFREE,PLFTOT,MXNPRO,MAXPLT,DISLAS,
	DISFUS,PLT,NODIS,MAXPFT,PFTOT,PCFTOT,NOLS,EDLIN,FTREV,SCF,
	MAXSCF,PFREE,MAXPLS,MAXPVS,MAPTRC,PFTKEY,MEOF,X,Y,DRX,DRY,DFORCE,
	CFILES,NOUT,III,FRAME,XTRACE;

SAFEX INTERNAL INTEGER ARRAY DICH,DION,DISP,DISPS,DADR,DBRSI[0:15],MCHN[1:10];

SAFEX INTERNAL STRING ARRAY CMSTRS[0:9],CMSAV[1:10];

INTEGER EDGMIN, LINMIN;
_ external procedures ;

	QEIP LINFIT;
	QEP INITIA;
	QEP TELL(QS S);
	QEP UNTELL;
	QEIP QSET(QRI I);
	QESP QREAD;
	QEP SETPAR;
	QEP COMST;
	QENP SORTED;
	QEP EDSAVE;
	QEP EDREST;
	QEP LISAVE;
	QEP LIREST;
	QEP PRSAVE;
	QEP PRREST;
	QEP REGREF(QI I);
	QENP XREFC(QI I);
	QEP TRANSUP;
	QEP UNXREF;
	QEP PRECAL;
	QEP CALC;
	QEP FILESP(QI I);
	QEP UPPDAT;
	QEP LINED;
	QEP RELOPT;
	QEIP BITS(QI I,J,K);
	QESP EXPL(QI I,J; QS S);
	QEIP LNFEAT(QI I);
	QEIP COFEAT(QI I,J,K,L);
	QEIP FINDFT(QI I);
	QEP PARSE;
	QEP CREPRO;
	QEP SHUFFL;
	QEP FTEX;
	QERP QRSET(QRR R);
	QEIP DISX(QR X);
	QEIP DISY(QR Y);
	QEIP LFDIF(QI I,J,K,L,T);
	QEIP MAPCONV(QS CODES);
	QEP OUTLINES;
	QEP K_ZERO;
	QEP K_OUT;
	QEP SUMINT(QRR A,B,C,D; QRI E);
	QEP EDGPRT;
	QEP LININT(QRR T,U,V,W,X,Y,Z);
	QEP LNINTA(QRI LVR, LVI; QRR XV,YV; QRI LC, LV, LI);
	QEP PROINT(QRI PR);
	QEP INTSTR;	QEP EDREC;
	QEP SAIINT(BOOLEAN TTY,PTY,MAIL);
_ initialize program;

	STDBRK(3);
	SETFORMAT(0,2);
	SETBREAK(13,'12&'40&"*?:⊗;",'15,"INS");
	SETBREAK(11,'40,NULL,"XRN");
	SETBREAK(12,".",NULL,"INS");
	SETBREAK(2,".[]"&'12,'15,"INS");
	SETBREAK(6,"."," "&'12&'15&"	","IRN");

	LOOP(IA,1,14,1)
		BEGIN
		DISP[IA] ← DION[IA] ← 0;
		DICH[IA] ← 1;
		END;
	DISP[1] ← DISP[2] ← DISP[4] ← DISP[5] ← DISP[14] ← 1;

	CMSTRS[0] ← "INPUT*PROT*PROTO.GUN[SYS,HE]*";
	CMSTRS[1] ← "H*SET*DISRPT*0*0*SCALE*5*5*LNCRE*1*1*CVLIN*1*"&
		"CALL*LINFIT*UNMARK*LINES*KILL*FRAME*EDGES*D*";
	CMSTRS[2] ← "H*CALL*PARSE*NULL*SET*LNCRE*2000*2999*D";

	INTMAP(INTTTY_INX,INTSTR,0);
	INTMAP(INTMAIL_INX,INTSTR,0);
	SAIINT(TRUE,FALSE,TRUE);
	ENABLE(INTTTY_INX);
	ENABLE(INTMAIL_INX);
	FRAME ← GETPOG;
	PUT_DATA(0,0,"GUNLO");
	OVERLAY ← TRUE;
	YES_GUN ← TRUE;

_ initialize variables;

	LNCRE1 ← LNCRE2 ← WHERE ← LDATE ← PFFREE ←	PFREE ← 1;
	IWHAT ← CVLIN ← WIND ← CFILES ← MAXPLS ← MAXPVS ← MODE ← DFORCE
		← DHOLD ← MTRACE ← PLT ← NODIS ← PLTOT ← PLFTOT ← PCFTOT
		← NOBAL ← XTRACE ← PFTOT ← NPRO ← SCF ← 0;
	NPAR ← 28;
	NOEPM ← 50;
	NOUT ← NGRF ← NLPT ← "A";
	MFILE ← COMSTR ← COMSAV ← NULL;
	NAME ← "GUN";
	LIEXT ← EDEXT ← PREXT ← ".TEM";
_ set adjustable constants;

	LINMIN ← 250;
	EDGMIN ← 200;
	MSAFA ← 30;
	RMSAF ← 0.5;
	RMEDA ← 90.;
	SHRINK ← 0.5;
	RDDP ← 1.5;
	RDNP ← 0.45;
	RMSD ← 0.3;
	RMLG ← 0.;
	RWIC ← 3.5;
	RMLE ← 15.;
	RCDI ← 5.;
	RELLF ← 0.18;
	RMALS ← 5.;
	RMRLS ← 0.3;
	ILLL ← 2;
	ILFL ← 3;
	RDEP ← 0.5;
	RMAP ← 12.;
	MXNPRO ← 15;

_ set display parameters

	ORIGX ← 163;
	ORIGY ← 165;
	SCALE ← 750;
	SIZE ← 2;
	IRX ← 150.;
	IRY ← 115.;
	DRX ← 215;
	DRY ← 150;
	DSCX ← DSCY ← 2.5;
	ISCX ← ISCY ← 0.4;
_ outer-level dynamic storage allocation;

_  * *         Prototype data-structure.	           * * *;

BL1:	MAXPFT←4*(MAXPLT←12*MXNPRO);

	BEGIN "BLOCK1"
	LABEL BL2;
	SAFEX INTERNAL STRING ARRAY PNAME[1:MXNPRO];
	SAFEX INTERNAL INTEGER ARRAY PLINES,PVERTS,PPTRL[1:MXNPRO],
		PFLST,PFPRO,PFEAT[1:MAXPFT],
		PFPTR[0:MAXPFT],PLINE,PLINE2,PLINEF[1:MAXPLT];
	PROINT(PLINEF[1]);
	IF WHERE≠1 THEN PRREST;


_ * * *      Edge-storage arrays.			* * * * *;

BL2:	NOEPL←(NOEPA MAX EDGMIN)+NOEPM;

	BEGIN "BLOCK2"
	LABEL BL3;
	SAFEX INTERNAL REAL ARRAY EAX,EAY,EBX,EBY[1:NOEPL];
	SAFEX INTERNAL INTEGER ARRAY LE[1:NOEPL];
	SUMINT(EAX[1],EAY[1],EBX[1],EBY[1],LE[1]);
	IF WHERE≠1∧WHERE≠10 THEN EDREST;

_ * * *          Line data-structure. Display-buffer.		* * * * *;


BL3:	NOBAL ← NOBAL MAX LINMIN;
	MAXSCF ← 2*(MAXNOV ← 2*(MAXNOL ← NOBAL+NOBAL*RMSAF+MSAFA));
	DISLAS ← NOEPL+NOEPL%10+4*MAXNOV+280;

	BEGIN "BLOCK3"
	SAFEX INTERNAL INTEGER ARRAY DISBUF[1:DISLAS+2],LEDG1,LEDG2,LCREDE,
		LFEAT[1:MAXNOL],LVERSI,LVERCO,LVER,LINK[1:MAXNOV],
		CFEAT[1:MAXSCF];
	SAFEX INTERNAL REAL ARRAY XVCOR,YVCOR,SVANG,XLCOR,YLCOR[1:MAXNOV],

		CXL,CYL,CCL,RLEN,ANGARG[1:MAXNOL];
	LABEL COMND,COM1,COM2,MARK,UNMARK,CALL1,SHOW,KILL,SETT,PRINT,CALL,
		CPA,SAV,INP,INP1,PLOT,DOIT,EDIT,DD,NO,NO1,UPLIN,COM3,
		RECEV,REC1;

	LININT(CXL[1],CYL[1],CCL[1],ANGARG[1],RLEN[1],XLCOR[1],YLCOR[1]);
	LNINTA(LVERCO[1],LVERSI[1],XVCOR[1],YVCOR[1],LCREDE[1],LVER[1],
		LINK[1]);
	III←-1;
	START_CODE DEFINE TTY="'51000000000"; TTY 6,III; END;
	III ← IF III<0 THEN LOCATION(DISBUF[1])-1 ELSE 0;
_ initialization and program (command) loop of BLOCK3.;

	IF WHERE≠1 THEN BEGIN UNTELL; LIREST END;

	_	initialize display routines;

	DPYSET(DISBUF);
	DISFUS←DPYPARS-1;
	RELOPT;
	OVERLAY←TRUE;
	DADR[1]←4;
	DBRSI[1]←'4046;
	DADR[2]←14;
	DBRSI[2]←'4046;
	DADR[3]←IA←55+NOEPL+NOEPL%10;
	DBRSI[3]←'1046;
	DADR[4]←IA←IA+210;
	DBRSI[4]←'4046;
	DADR[5]←IA←IA+MAXNOV+5;
	DBRSI[5]←'1046;
	DADR[6]←IA←IA+MAXNOV+5;
	DBRSI[6]←'1046;
	DADR[7]←IA+2*MAXNOV+5;	_ Last pog. is a dummy (for jump address);
	INITIA;
	TRANSUP;
	NODIS←0;

	_ 	dispatch when returning from array expansion-contraction;

	CASE WHERE OF BEGIN
		;
		"1-normal value"	;
		"2-LINEFIT"	GO CALL1;
		"3-NOEDGES"	GO NO1;
		"4-CONTRACT"	GO COM3;
		"5-INSERT"	BEGIN LINED; GO COM2 END;
		"6-SPLITL"	BEGIN LINED; GO COM2 END;
		"7-NOLINES"	GO NO1;
		"8-LIREST"	GO INP1;
		;
		"10-EDREC"	GO REC1;
		"11-EDREST"	GO INP1;
		;;;;
		"16-PRO-LNSRT"	BEGIN CREPRO; GO COM2 END;
		"17-PRREST"	GO INP1;
		"18-PRO-NPRO"	BEGIN CREPRO; GO COM2 END;
		"19-PRO-MXPLT"  BEGIN CREPRO; GO COM2 END;
		"20-PARSE"	GO CPA;
		      END;
_ command decoding loop;

COMND:	IF ¬MODE THEN
		BEGIN
		OUTSTR(CL&"$"&CL);
		MODE ← -1;
		END;
	H←QREAD;

COM1:	IF EQU(H,"DO") THEN GO DOIT;
	IF EQU(H,"DD") THEN GO DD;
	IF EQU(H,"MARK") THEN GO MARK;
	IF EQU(H,"UNMARK") THEN GO UNMARK;
	IF EQU(H,"EDIT") THEN GO EDIT;
	IF EQU(H,"SET") THEN GO SETT;
	IF EQU(H,"CALL") THEN GO CALL;
	IF EQU(H,"SHOW") THEN GO SHOW;
	IF EQU(H,"KILL") THEN GO KILL;
	IF EQU(H,"PRINT") THEN GO PRINT;
	IF EQU(H,"PLOT") THEN GO PLOT;
	IF EQU(H,"SAVE") THEN GO SAV;
	IF EQU(H,"NO") THEN GO NO;
	IF EQU(H,"INPUT") THEN GO INP;
	IF EQU(H,"RECEIVE") THEN GO RECEV;
	IF EQU(H,"H") THEN DHOLD←1 ELSE
	IF EQU(H,"D") THEN BEGIN DHOLD←0; UPPDAT; END ELSE
	IF EQU(H,"MOVE") THEN
		BEGIN
		IRX←IRX-ISCX*NUMI;
		IRY←IRY-ISCY*NUMI;
		TRANSUP;
		END ELSE
	IF EQU(H,"UPDIS") THEN
		BEGIN
		DFORCE ← 1;
		DICH[0] ← NUMI;
		UPPDAT;
		DFORCE ← 0;
		END ELSE
	IF EQU(H,"BLANK") THEN LOOP(IA,1,35,1) OUTSTR(CL) ELSE
	IF EQU(H,"CLEAR") THEN K_ZERO ELSE
	IF EQU(H,"CLOSE") THEN K_OUT;

COM2:	IF BRCHAR≠'12 THEN BEGIN H←QREAD; WHERE←1; GO COM1 END;
	GO COMND;
_ sub-command decoding - DO, MARK, UNMARK, PLOT;

DOIT:	IF EQU(H←QREAD,"FILE") THEN
		BEGIN
		OPEN(MCHN[CFILES+1]←GETCHAN,"DSK",0,2,0,900,BRCHAR,MEOF);
		LOOKUP(MCHN[CFILES+1],MFILE←QREAD,IA);
		IF IA THEN BEGIN OUTSTR(" WHAT FILE?"); GO COMND END;
		CMSAV[CFILES←CFILES+1]←COMSTR;
		COMSTR←NULL;
		END ELSE IF EQU(H,"COM") THEN
			COMSTR←CMSTRS[NUMI]&COMSTR
		    ELSE BEGIN QUEST; GO COMND END;
	MODE←1;
	GO COMND;

DD:	GO COMND;   _ A breakpoint here is a convenient way to get into RAID;

MARK:	H←QREAD;
	IF EQU(H,"EDGES") THEN DISP[3]←1 ELSE
	IF EQU(H,"VERTICES") THEN DISP[6]←1 ELSE
	IF EQU(H,"LINES") THEN DISP[5]←1 ELSE GO COM1;
	UPPDAT;
	QUNFIN MARK;

UNMARK:	H←QREAD;
	IF EQU(H,"EDGES") THEN DISP[3]←0 ELSE
	IF EQU(H,"VERTICES") THEN DISP[6]←0 ELSE
	IF EQU(H,"LINES") THEN DISP[5]←0 ELSE GO COM1;
	UPPDAT;
	QUNFIN UNMARK;

PLOT:	TELL("plotting");
	LOOP(IA,1,14,1) BEGIN DISPS[IA]←DISP[IA]; DISP[IA]←0 END;
	WHILE BRCHAR≠'12 DO DISP[NUMI]←1;
	PLT←1;
	UPPDAT;
	PRECAL;
	CALC;
	LOOP(IA,1,14,1) DISP[IA]←DISPS[IA];
	UPPDAT;
	UNTELL;
	PLT←0;
	GO COMND;
_	more sub-command decoding - EDIT, KILL, PRINT;

EDIT:	H←QREAD;
	IF EQU(H,"PARAM") THEN SETPAR ELSE
	IF EQU(H,"LINES") THEN
		BEGIN
		LINED;
		IF WHERE=5∨WHERE=6 THEN
			BEGIN
			IF EQU(LIEXT,".TEM") THEN LISAVE;
			NODIS←1;
			GO BL3;
			END;
		END ELSE
	IF EQU(H,"PROT") THEN
		BEGIN
		EDLIN←NUMI;
COM3:		CREPRO;
		IF WHERE≥18 THEN
			BEGIN
			NODIS←1;
			IF EQU(LIEXT,".TEM") THEN LISAVE;
			IF EQU(EDEXT,".TEM") THEN EDSAVE;
			IF EQU(PREXT,".TEM") THEN PRSAVE;
			TELL("prot-expand");
			GO BL1;
			END;
		IF WHERE=16 THEN
			BEGIN
			NODIS←1;
			IF EQU(LIEXT,".TEM") THEN LISAVE;
			GO BL3;
			END;
		END ELSE
	IF EQU(H,"COM") THEN COMST ELSE GO COM1;
	QUNFIN EDIT;

KILL:	H←QREAD;
	IF EQU(H,"FRAME") THEN DISP[1]←0 ELSE
	IF EQU(H,"EDGES") THEN BEGIN DISP[2]←DISP[3]←0  END  ELSE
	IF EQU(H,"LINES") THEN DISP[4]←DISP[5]←DISP[6]←0 ELSE GO COM1;
	UPPDAT;
	QUNFIN KILL;

PRINT:	H←QREAD;
	IF EQU(H,"REGREF") THEN REGREF(NUMI)  ELSE
	IF EQU(H,"EDGES") THEN EDGPRT ELSE GO COM1;
	QUNFIN PRINT;
_  more sub-command decoding - SET;

SETT:	H←QREAD;
	IF EQU(H,"SCALE") THEN
		BEGIN
		ISCX←1./QRSET(DSCX);
		ISCY←1./QRSET(DSCY);
		TRANSUP;
		END ELSE
	IF EQU(H,"BRTSIZ") THEN
		BEGIN 
		DBRSI[IB←NUMI]←'46 LOR (NUMI LSH 
			(IF IB≤2∨IB=4 THEN 11 ELSE 8));
		DICH[IB]←1;
		UPPDAT
		END ELSE
	IF EQU(H,"FULREC") THEN QSET(FULREC) ELSE
	IF EQU(H,"LOC") THEN TYPLOC(QSET(LOCT),QSET(LOCB)) ELSE
	IF EQU(H,"WHAT") THEN QSET(IWHAT) ELSE
	IF EQU(H,"TRACE") THEN QSET(MTRACE) ELSE
	IF EQU(H,"XTRACE") THEN QSET(XTRACE) ELSE
	IF EQU(H,"CVLIN") THEN BEGIN QSET(CVLIN);DICH[4]←1;UPPDAT END ELSE
	IF EQU(H,"WIND") THEN QSET(WIND) ELSE
	IF EQU(H,"LDATE") THEN QSET(LDATE) ELSE
	IF EQU(H,"NAME") THEN
		BEGIN
		OUTSTR(" NAME = "&NAME&" ← ");
		NAME←QREAD;
		NOUT←NGRF←NLPT←"A"
		END  ELSE
	IF EQU(H,"LNCRE") THEN
		BEGIN
		QSET(LNCRE1);
		QSET(LNCRE2);
		DICH[4]←DICH[5]←DICH[6]←1;
		UPPDAT
		END  ELSE
	IF EQU(H,"DISRPT") THEN BEGIN QSET(DRX);QSET(DRY);TRANSUP END ELSE
	IF EQU(H,"INTRPT") THEN BEGIN QRSET(IRX); QRSET(IRY); TRANSUP END
	   ELSE GO COM1;
	QUNFIN SETT;
_ more sub-command decoding - CALL;

CALL:	H←QREAD;

CALL1:	IF EQU(H,"LINFIT") THEN
		BEGIN
		INITIA;
		IF WHERE=1 THEN TELL("line-fit");
		WHERE←1;
		IDUM←LINFIT;
		IF IDUM THEN
			BEGIN
			WHERE←2;
			TELL("expanding");
			NOL ← NOV ← 0;
			GO BL3
			END ELSE BEGIN
			DICH[4]←DICH[5]←DICH[6]←1;
			UPPDAT;
			UNTELL
			END
		END ELSE 
	IF EQU(H,"SORTED") THEN BEGIN SORTED; DICH[3]←1; UPPDAT END  ELSE
	IF EQU(H,"UNXREF") THEN BEGIN UNXREF;GO TO UPLIN; END ELSE
	IF EQU(H,"FTEX") THEN FTEX ELSE
	IF EQU(H,"PARSE") THEN
		BEGIN
		MAPTRC←MAPCONV(QREAD);
		IF ¬NPRO THEN
			BEGIN OUTSTR("No prototypes"&CL); GO COMND; END;
		IF NOL>0.65*MAXNOL THEN
			BEGIN
			NOBAL←(1.6*NOL-MSAFA)/RMSAF+1;
			TELL("expanding");
			IF EQU(LIEXT,".TEM") THEN LISAVE;
			NODIS←1;
			WHERE←20;
			GO BL3
			END;
CPA:		LIEXT←".TEM";
		WHERE←1;
		PARSE
		END ELSE
	IF EQU(H,"XREF") THEN
		BEGIN XREFC(NUMI);
UPLIN:		DICH[6]←1;
		IF CVLIN THEN DICH[4]←1;
		UPPDAT
		END  ELSE GO COM1;
	QUNFIN CALL;
_ more sub-command decoding - SHOW;

SHOW:	H←QREAD;
	IF EQU(H,"INTRPT") THEN
		OUTSTR(" ("&CVS(DISX(IRX))&","&CVS(DISY(IRY))&")"&CL) ELSE
	IF EQU(H,"LNFEAT") THEN
		BEGIN
		IDUM←LNFEAT(NUMI);
		OUTSTR(EXPL(IDUM,'430771430771,"{#≥#≤∧-∀-.≡#≥#≤∧-∀-.}")&
			(QFTREV)&"  ENTRY: "&CVS(FINDFT(IDUM))&CL)
	        END ELSE
	IF EQU(H,"COFEAT") THEN
		BEGIN
		LOOP(IA,1,2,1) BEGIN IB←IDUM; IDUM←NUMI; IC←ID;
		    ID←FINDFT(LNFEAT(IDUM))*(FTREV=1) END;
		IDUM←COFEAT(IB,IDUM,IC,ID);
		OUTSTR(EXPL(IDUM,'401437401437,"{*→@∀---≡*→@∀---}")&(QFTREV)&
		  "  ENTRY: "&CVS(FINDFT(IDUM))&CL)
		END ELSE
	IF EQU(H,"CFEAT")∧(IDUM←NUMI+PLFTOT)≤PFTOT THEN
		BEGIN
		IDUM←BITS(PFPTR[IDUM],12,23);
		WHILE IDUM DO
		    OUTSTR(CVS(IDUM)&" →  L1: "&CVS((IA←BITS(IDUM←
			CFEAT[IDUM],24,35)) LAND '3777)&" "&
			CVS(IA LSH -11)&"  L2: "&CVS((IA←BITS(IDUM,12,23))
			 LAND '3777)&" "&CVS(IA LSH -11)&"  → "&
			CVS(IDUM←IDUM LAND '7777)&CL)
		END ELSE
	IF EQU(H,"LFDIF") THEN
		BEGIN
		IA←LNFEAT(NUMI);
		IB←-(FTREV=1);
		IC←LNFEAT(NUMI);
		ID←-(FTREV=1);
		OUTSTR(EXPL(LFDIF(IA,IC,NUMI XOR IB,NUMI XOR ID,FALSE),
			    '742105742105,"{-≥-#SEC≡-≥-#SEC}")&
		 " + "&EXPL(MODIF,'252525252525,"{-----------------}")&CL)
	 	END  ELSE
	IF EQU(H,"FRAME") THEN DISP[1]←1 ELSE
	IF EQU(H,"EDGES") THEN
		BEGIN
		IA←IAEDG;
		IAEDG←NUMI;
		DISP[2]←1;
		IF IA≠IAEDG THEN DICH[2]←1
		END ELSE
	IF EQU(H,"LINES") THEN DISP[4]←1 ELSE GO COM1;
	UPPDAT;
	QUNFIN SHOW;
_ more sub-command decoding - NO, SAV;

NO:	H←QREAD;
	IF EQU(H,"EDGES") THEN
		BEGIN
		EDEXT←".TEM";
		IF EQU(LIEXT,".TEM") THEN LISAVE;
		NOEPA←0;
		DICH[2]←DICH[3]←1;
		UPPDAT;
		NODIS←1;
		WHERE←3;
		GO BL2
		END ELSE
	IF EQU(H,"LINES") THEN
		BEGIN
		LIEXT←".TEM";
		NOBAL←NOL←0;
		DICH[4]←DICH[5]←DICH[6]←1;
		UPPDAT;
		WHERE←7;
		GO BL3
	        END ELSE GO COM1;
NO1:	WHERE←1;
	QUNFIN NO;

SAV:	H←QREAD;
	IF EQU(H,"EDGES") THEN BEGIN FILESP(2); EDSAVE END ELSE
	IF EQU(H,"LINES") THEN BEGIN SHUFFL; FILESP(1); LISAVE END ELSE
	IF EQU(H,"PROT")  THEN BEGIN FILESP(3); PRSAVE END ELSE
	IF EQU(H,"STRUCT") THEN OUTLINES ELSE GO COM1;
	QUNFIN SAV;
_ more sub-command decoding - RECEIVE;

RECEV:	IF MODE≥0 THEN
		BEGIN "ERR2"
		OUTSTR("RECEIVE COMMAND ONLY LEGAL AS M.P. !!"&CL);
		GO COM2;
		END "ERR2";
	H ← QREAD;
	IF EQU(H,"EDGES") THEN
		BEGIN "MEDGE"
		INTEGER MESS;
		MESS ← GET_ENTRY('70,"EDGE","GUNLO","G_EDGES");
		IF ¬MESS THEN
			BEGIN "ERR1"
			OUTSTR("NO EDGE DATA AVAILABLE"&CL);
			GO COM2;
			END "ERR1";
		QUEUE('600,MESS);
		NOL ← NOV ← 0;
		IF NOEPL<NOEPA THEN
			BEGIN "EXP"
			WHERE ← 10;
			NOBAL ← NOEPA*RDEP/8.;
			TELL("EDGE-EXPAND");
			GO BL2;
			END "EXP";

REC1:		WHERE ← 1;
		EDREC;
		END "MEDGE" ELSE GO COM1;
	UPPDAT;
	QUNFIN RECEV;
_ end of sub-command decoding - INPUT;

INP:	H←QREAD;
	IF EQU(H,"EDGES") THEN
		BEGIN
		FILESP(2);
		EDREST;
		QERR;
		IF WHERE=11 THEN
			BEGIN
			NOBAL←NOEPA*RDEP/8.;
			TELL("edge-expand");
			GO BL2
			END;
		END ELSE
	IF EQU(H,"LINES") THEN
		BEGIN
		FILESP(1);
		LIREST;
		QERR;
		DICH[4]←DICH[5]←DICH[6];
		IF WHERE=8 THEN
			BEGIN
			TELL("line-expand");
			GO BL3
			END;
		END ELSE
	IF EQU(H,"PROT")  THEN
		BEGIN
		FILESP(3);
		PRREST;
		QERR;
		IF WHERE=17 THEN
			BEGIN
			TELL("prot-expand");
			GO BL1
		        END
 	        END ELSE GO COM1;
INP1:	WHERE←1;
	UPPDAT;
	QUNFIN INP;

_ * * * * *      THAT WAS THE END OF THE COMMAND-LOOP      * * * * *;

	END "BLOCK3";

	END "BLOCK2";

	END "BLOCK1";

END "GUNLO";_	 END OF GUNLOK	;